package com.douqu.game.core.config;

import com.douqu.game.core.config.card.CardConfig;
import com.douqu.game.core.config.common.CommonData;
import com.douqu.game.core.e.E_InitDataType;
import com.douqu.game.core.entity.GameObject;
import com.douqu.game.core.factory.DataFactory;
import com.douqu.game.core.factory.LoadFactory;
import com.douqu.game.core.util.LoadUtils;
import com.douqu.game.core.util.LogUtils;
import com.douqu.game.core.util.CoreUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 初始数据
 * Created by bean on 2017/7/14.
 */
public class InitDataConfig extends GameObject {

    /**
     * 类型
     */
    public int type;

    /**
     * 条件
     */
    public int condition;

    public String defaultPlayerHead;

    public String goods;

//    /** 初始水晶(水晶;最大水晶数量) */
//    public String crystal;
//    /** 水晶成长
//     * 60;1000|180;500
//     * 时间单位是毫秒，最后一组的时间是战斗一局的最长时间
//     * 前60秒每秒增加1点，60-180秒每0.5秒增加1点
//     * */
//    public CommonData[] crystalGrow;
//
//    /** 初始水晶数量 */
//    public int curCrystal;
//    /** 初始最大水晶数量 */
//    public int maxCrystal;
    /**
     * 初始资源
     */
    public CommonData[] initAssets;
    /**
     * 初始道具
     */
    public CommonData[] initProps;

    /**
     * 初始化限时道具
     */
    public CommonData[] timeProps;

//    /***
//     * 首次高级抽单次必中
//     */
//    public CommonData[] firstLotteryReward;
    /**
     * 初始兵种(这里的兵种全都初始成1级,其它没有初始化的全都是0级，需要碎片才能升到1级)
     */
    public int[] initCards;

//    /**
//     * 初始化的全局消息提示条件
//     */
//    public int[] globalNoticeCondition;
//
//    /**
//     * 阵营战公共奖励
//     */
//    public CommonData[] campActivityReward;
//
//    /** 前端展示 */
//    public String campActivityRewardShow;


//    public int getFistCardId(int camp)
//    {
//        for(CommonData commonData : firstLotteryReward)
//        {
//            if(commonData.id == camp)
//                return commonData.value;
//        }
//        return 0;
//    }

//    /**
//     * 获取阵营战公共奖励
//     * @return
//     */
//    public List<Integer> getCampActivityReward()
//    {
//        List<Integer> result = new ArrayList<>();
//        for(CommonData commonData : campActivityReward)
//        {
//            if(com.bean.core.util.Utils.checkRandom10000(commonData.value))
//                result.add(commonData.id);
//        }
//        LogUtils.debug("阵营战结束，加入拍卖行 -> " + result);
//        return result;
//    }


    public boolean init(){
        String key = "goods";
        String value = goods;
        switch (E_InitDataType.getValue(type)){
            //枚举中每个枚举其实也都是个类 在编译的时候会生成一个唯一的static final的实例
            case ASSETS:
                initAssets = LoadUtils.loadCommonDataToArray(key, value);
                return LoadUtils.checkCommonData(initAssets, this.getClass(), key, DataFactory.ASSET_KEY, id);
            case PROPS:
                initProps = LoadUtils.loadCommonDataToArray(key, value);
                return LoadUtils.checkCommonData(initProps, this.getClass(), key, DataFactory.PROP_KEY, id);
            case CARDS:
                if(CoreUtils.isErrorValue(value))
                {
                    initCards = new int[0];
                }
                else
                {
                    initCards = LoadUtils.loadIntArray(key, value);
                    for (int id : initCards) {
                        CardConfig cardConfig = DataFactory.getInstance(LoadFactory.isTestLoad()).getGameObject(DataFactory.CARD_KEY, id);
                        if (cardConfig == null) {
                            LogUtils.error("Load InitData Error: Card is null! id=" + id);
                            return false;
                        }
                    }
                }
//                LogUtils.info("初始化InitDatConfig -> " + this + " hashcode:" + hashCode());
                return true;
            case TIMEPROPS:
                timeProps = LoadUtils.loadCommonDataToArray(key, value);
                return LoadUtils.checkCommonData(timeProps, this.getClass(), key, DataFactory.PROP_KEY, id);
            default:
                return super.check();
        }
    }

    @Override
    public boolean setVariable(String key, String value)
    {


//        switch (key)
//        {
//            case "initAssets":
//                initAssets = LoadUtils.loadCommonDataToArray(key, value);
//                return LoadUtils.checkCommonData(initAssets, this.getClass(), key, DataFactory.ASSET_KEY, id);
//            case "initProps":
//                initProps = LoadUtils.loadCommonDataToArray(key, value);
//                return LoadUtils.checkCommonData(initProps, this.getClass(), key, DataFactory.PROP_KEY, id);
//            case "timeProps":
//                timeProps = LoadUtils.loadCommonDataToArray(key, value);
//                return LoadUtils.checkCommonData(timeProps, this.getClass(), key, DataFactory.PROP_KEY, id);
//            case "initCards":
//                if(CoreUtils.isErrorValue(value))
//                {
//                    initCards = new int[0];
//                }
//                else
//                {
//                    initCards = LoadUtils.loadIntArray(key, value);
//                    for (int id : initCards) {
//                        CardConfig cardConfig = DataFactory.getInstance(LoadFactory.isTestLoad()).getGameObject(DataFactory.CARD_KEY, id);
//                        if (cardConfig == null) {
//                            LogUtils.error("Load InitData Error: Card is null! id=" + id);
//                            return false;
//                        }
//                    }
//                }
//                return true;
//            case "crystal":
//                crystal = value;
//
//                int[] ints = LoadUtils.loadIntArray(key, value);
//                curCrystal = ints[0];
//                maxCrystal = ints[1];
//                return true;
//            case "crystalGrow":
//                crystalGrow = LoadUtils.loadCommonDataToArray(key, value);
//                return true;
//            case "firstLotteryReward":
//                firstLotteryReward = LoadUtils.loadCommonDataToArray(key, value);
//                for(CommonData commonData : firstLotteryReward)
//                {
//                    if(DataFactory.getInstance(LoadFactory.isTestLoad()).getGameObject(DataFactory.CARD_KEY, commonData.value) == null)
//                    {
//                        LogUtils.error("Load InitData firstLotteryReward Error -> cardId:" + commonData.value);
//                        return false;
//                    }
//                }
//                return true;
//            case "globalNoticeCondition":
//                if(CoreUtils.isErrorValue(value))
//                {
//                    return false;
//                }
//                else
//                {
//                    globalNoticeCondition = LoadUtils.loadIntArray(key, value);
//                }
//                return true;
//            case "campActivityReward":
//                campActivityReward = LoadUtils.loadCommonDataToArray(key, value);
//                return true;
//            default:
//                return super.setVariable(key,value);
//        }
        return super.setVariable(key,value);
    }

    /**
     * 只要是加载配置时调用 isTest必须传递LoadFactory.isTestLoad()
     * @param type
     * @param isTest
     * @return
     */
    public static List<InitDataConfig> getConfigByType(E_InitDataType type, boolean isTest)
    {
        List<InitDataConfig> list = DataFactory.getInstance(isTest).getDataList(DataFactory.INIT_DATA);
        if (list == null || list.size() == 0){
            return null;
        }
        List<InitDataConfig> dataConfigs = new ArrayList<>();
        for (InitDataConfig initDataConfig:list){
            if (initDataConfig.type == type.getCode()){
                dataConfigs.add(initDataConfig);
            }
        }
        return dataConfigs;
    }

    @Override
    public String toString() {
        return "InitDataConfig{" +
                "type=" + type +
                ", condition='" + condition + '\'' +
                ", goods='" + goods + '\'' +
                '}';
    }
}